package core

import (
	"sync"
	"time"
)

// serverImpl 服务接口
type serverImpl interface {
	New(path, user, pwd string, bpm int) *connect // 创建服务
	Start()                                       // 运行服务通信
	Stop()                                        // 停止服务
}

// server 服务
type server struct {
}

// connects 接口连接组
var connects []*connect = make([]*connect, 0)

// Server 对外使用的服务组件
var Server serverImpl = (*server)(nil)

// Bpm 默认心率:60 每60s向所有连接发起一次通信
var Bpm = 60
var stop = false

// mock 中央锁
var mock sync.WaitGroup

// New 创建服务
// @param path 地址
// @param user 用户名
// @param pwd  密码
// @param bpm 心率(s)每隔bpm进行重连
func (*server) New(path, user, pwd string, bpm int) *connect {
	mock.Add(1)
	c := &connect{
		Path: path,
		User: user,
		Pwd:  pwd,
	}
	connects = append(connects, c)
	mock.Done()
	return c
}

// Start 运行服务通信
func (*server) Start() {
	stop = false
	ticker := time.NewTicker(time.Second * time.Duration(Bpm))
	go func() {
		for {
			select {
			case <-ticker.C:
				mock.Wait()

				for i := len(connects); i > 0; i-- {
					c := connects[i]
					if c.Communication() {
						connects = connects[0 : i-1]
					}

				}
			default:
				if stop {
					return
				}
			}
		}
	}()
}

// Stop 停止服务
func (*server) Stop() {
	stop = true
}
